package com.tianjin.design.decorator;

/**
 *
 * @author tianjin
 *
 * 2023年3月30日
 * TODO 装饰器模式： 结构性设计模式
 *
 * 增强功能：允许向一个现有的对象添加新的功能，同时又不改变其结构。这种类型的设计模式属于结构型模式，它是作为现有的类的一个包装。
	这种模式创建了一个装饰类，用来包装原有的类，并在保持类方法签名完整性的前提下，提供了额外的功能。

   继承可以实现功能增强，但是会导致继承体系庞大，子类过多，而装饰器可以动态给已有对象添加功能，比子类灵活

 *
 * 1、先定义了Person接口，即为功能接口；
 * 2、再定义Man实现类，作为具体实现功能的类，此时即可模拟实际开发中的场景；
 * 3、为了扩展功能，动态增加功能，但是又不想增加新的子类，此时则可以选择装饰器模式；
 * 4、定义装饰抽象类 Decorator ，此类为抽象类且实现对应的功能接口，声明为抽象类是有讲究的， 装饰类只需要实现部分需要扩展功能的方法即可，无需关注其他；
 * 5、装饰类 Decorator 中需要定义被装饰对象，最开始我没想明白为什么，后续明白了，具体见装饰类 PersonDecorator；
 * 6、对于不同场景扩展不同功能，此时扩展功能具体实现类继承自Decorator即可，与原来的功能接口解耦；
 * 7、在装饰器子类中进行具体装饰，也就是功能扩展；
 * 8、测试与使用方法如下：
 */
public class Test {

	public static void main(String[] args) {

		System.out.println("装饰之前：");
		// 正常使用
		Person person = new Man();
		person.eat();


		System.out.println("装饰之后：");
		// 装饰，功能扩展，将需要装饰对象传递给装饰器
		person = new ManWashPersonDecorator(person);
		// 依然调用eat方法，但是此时装饰器内部已经对功能进行了装饰，对于客户端来说是没有感知的，事实上功能已经扩展
		person.eat();
	}
}
